package grupo1.fotomultas.Fotomultas.Categorias;

import grupo1.fotomultas.Fotomultas.CalendarGenerator;
import grupo1.fotomultas.Fotomultas.Vehiculo;
import grupo1.fotomultas.Fotomultas.Infracciones.Infraccion;
import grupo1.fotomultas.Fotomultas.Notificaciones.NotificacionConfiguracion;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;


public abstract class Categoria{
	
	private static Set<Categoria> categorias = new HashSet<Categoria>();
	protected  Set<NotificacionConfiguracion> notificacionesConfiguracion;
	
	protected abstract void verificarCategoriaVehiculo(Vehiculo vehiculo);
	
	public void notificar(Infraccion infraccion) {
		
		for (NotificacionConfiguracion notiConfig : this.notificacionesConfiguracion() ) {
			this.enviarNotificacion(notiConfig,infraccion);

		}
	}
	
	protected abstract void enviarNotificacion(NotificacionConfiguracion notiConfig,
			Infraccion infraccion);
	
	protected abstract void crearNotificacionesConfiguracion();
	
	protected Set<NotificacionConfiguracion> notificacionesConfiguracion(){
		if (notificacionesConfiguracion == null){
			notificacionesConfiguracion = new HashSet<NotificacionConfiguracion>();
			this.crearNotificacionesConfiguracion();
		}
		return notificacionesConfiguracion;
	}


	public static void actualizarCategoriasParaVehiculo(Vehiculo vehiculo) {
		//esto esta feo pero necesito saber como mejorarlo
		// COMMENT Muy bien por el comentario! jeje
		// no esta mal, si quieren les cuento otra alternativa a ver si te convence mas
		
		for(Categoria unaCategoria : categorias){
			unaCategoria.verificarCategoriaVehiculo(vehiculo);
		}
	
	}
	
	public static void actualizarCategoriasExistentesParaVehiculo(Vehiculo vehiculo) {
		for(Categoria unaCategoria : categorias){
			//Esto es para Cuando el vehiculo ya tiene la categoria y esta verificando para removerla
			unaCategoria.verificarCategoriaExistenteVehiculo(vehiculo);
		}
		
	}
	
	protected abstract void verificarCategoriaExistenteVehiculo(Vehiculo vehiculo);

	public static void crearCategorias(){
		 categorias.add(Evasor.Instance());
		 categorias.add(Frecuente.Instance());
		 categorias.add(Inhabilitado.Instance());
		 	
	}
	
	protected boolean esMoroso(Vehiculo vehiculo, int DeudaPermitida) {
		return vehiculo.totalDineroAdeudado()< DeudaPermitida;
	}
	
	protected boolean ausenciaDeInfraccionesEnUnPeriodo(Vehiculo vehiculo, int anios, int meses, int dias) {
		Calendar fechaAComparar;
		Infraccion ultimaInfraccion;
		
		ultimaInfraccion = vehiculo.obtenerUltimaInfraccion();
		if (ultimaInfraccion.equals(null))
			return false;
		
		fechaAComparar = CalendarGenerator.Instance().generarFechaAnterior(anios, meses, dias);
		return this.esAnterior(ultimaInfraccion, fechaAComparar);
	}

	private boolean esAnterior(Infraccion ultimaInfraccion, Calendar fechaAComparar) {
		return fechaAComparar.after(ultimaInfraccion.getFecha());
		
	}

	
}	
		
	
	

